package logs

import "fmt"

// InvokeLog fast use log in struct
type InvokeLog struct {
	logger ILog
}

func (ink *InvokeLog) AddLogger(logger ILog) {
	ink.logger = logger
}

func (ink *InvokeLog) GetLogger() ILog {
	return ink.logger
}

func (ink *InvokeLog) Log(level LogLevel, msg string) {
	if ink.logger == nil {
		return
	}
	switch level {
	case DebugLog:
		ink.logger.Debug(msg)
	case WarnLog:
		ink.logger.Warn(msg)
	case InfoLog:
		ink.logger.Info(msg)
	case ErrorLog:
		ink.logger.Error(msg)
	case FatalLog:
		ink.logger.Fatal(msg)
	case PanicLog:
		ink.logger.Panic(msg)
	}
}

func (ink *InvokeLog) Debug(log string, params ...interface{}) {
	if ink.logger == nil {
		return
	}
	if len(params) <= 0 {
		ink.logger.Debug(log)
		return
	}

	ink.logger.Debug(fmt.Sprintf(log, params...))
	return
}

func (ink *InvokeLog) Info(log string, params ...interface{}) {
	if ink.logger == nil {
		return
	}
	if len(params) <= 0 {
		ink.logger.Info(log)
		return
	}

	ink.logger.Info(fmt.Sprintf(log, params...))
	return
}

func (ink *InvokeLog) Warn(log string, params ...interface{}) {
	if ink.logger == nil {
		return
	}
	if len(params) <= 0 {
		ink.logger.Warn(log)
		return
	}

	ink.logger.Warn(fmt.Sprintf(log, params...))
	return
}
func (ink *InvokeLog) Error(log string, params ...interface{}) {
	if ink.logger == nil {
		return
	}
	if len(params) <= 0 {
		ink.logger.Error(log)
		return
	}

	ink.logger.Error(fmt.Sprintf(log, params...))
	return
}
func (ink *InvokeLog) Panic(log string, params ...interface{}) {

	if ink.logger == nil {
		return
	}
	if len(params) <= 0 {
		ink.logger.Panic(log)
		return
	}

	ink.logger.Panic(fmt.Sprintf(log, params...))
	return
}
func (ink *InvokeLog) Fatal(log string, params ...interface{}) {
	if ink.logger == nil {
		return
	}
	if len(params) <= 0 {
		ink.logger.Fatal(log)
		return
	}

	ink.logger.Fatal(fmt.Sprintf(log, params...))
	return
}
func (ink *InvokeLog) Write(p []byte) (n int, err error) {
	return ink.logger.Write(p)
}
func (ink *InvokeLog) Ctl(t bool) ILog {
	if !t {
		return _nullLog
	}
	return ink
}

func (ink *InvokeLog) Caller(skip int) ILog {
	return &InvokeLog{
		logger: ink.logger.CallerSkip(skip),
	}
}

func (ink *InvokeLog) CallerSkip(skip int) ILog {
	return ink.Caller(skip)
}
